﻿using BLevy.Entidad;
using BLevy.Negocio;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI
{
    public partial class frmCuponesEntrada : Form
    {
        Utils.Numeros U = new Utils.Numeros();

        Cupon _cupon = new Cupon();

        IList<CobradorCupon> cuponesEntradaL;
        IList<Cobro> cuponesPagosL;

        IList<CobradorCupon> cuponesAsignadosL;

        IList<Cupon> cuponesL = new List<Cupon>();

        // LISTADOS IDs DE CUPONES
        IList<int> idCuponesAsignadosL;
        IList<int> idCuponesEntradaL;

        public frmCuponesEntrada()
        {
            InitializeComponent();
        }

        private void frmCuponesEntrada_Load(object sender, EventArgs e)
        {
            inicializar();
        }

        private void inicializar()
        {
            cuponesAsignadosL = new List<CobradorCupon>();

            try
            {
                // -- COBRADORES --
                DataTable cobradores = new DataTable();
                cobradores.Columns.Add("ID");
                cobradores.Columns.Add("NOMBRE");
                Cobradores.FindAll().Where(cobrador => cobrador.activo == 1 && cobrador.id != 1).ToList().ForEach(i => cobradores.Rows.Add(i.id, i.apellido + ", " + i.nombres));

                cboCobrador.DisplayMember = "NOMBRE";
                cboCobrador.ValueMember = "ID";
                cboCobrador.DataSource = cobradores.DefaultView;
                cboCobrador.SelectedIndex = -1;
                // -----------------

                dtpFecha.Value = DateTime.Now;

                // -- GRILLAS --
                dgvCuponesImpagos.AutoGenerateColumns = false;
                dgvCuponesImpagos.Rows.Clear();
                dgvCuponesImpagos.DataSource = null;

                dgvCuponesPagos.AutoGenerateColumns = false;
                dgvCuponesPagos.Rows.Clear();
                dgvCuponesPagos.DataSource = null;

                dgvCuponesAsignados.AutoGenerateColumns = false;
                dgvCuponesAsignados.Rows.Clear();
                dgvCuponesAsignados.DataSource = null;
                // -------------

                // -- CAMPOS --
                limpiarCuponesImpagos();
                limpiarCuponesPagos();
                // ------------

                tabControl1.SelectedTab = tabPage1;

                cboCobrador.Focus();

                error.Clear();
                error.SetIconAlignment(label5, ErrorIconAlignment.MiddleLeft);
                error.SetIconPadding(label5, 10);

            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #region Cupones Impagos

        private void limpiarCuponesImpagos()
        {
            txtCuponImpago.Text = string.Empty;
            txtCuponImpago.Focus();
        }

        private void txtCuponImpago_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarCupon(txtCuponImpago, "ENTER");
            }
        }

        private void txtCuponImpago_Leave(object sender, EventArgs e)
        {
            BuscarCupon(txtCuponImpago, "LEAVE");
        }

        private void dgvCuponesImpagos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex == 6)
                {
                    dgvCuponesImpagos.Rows.RemoveAt(e.RowIndex);

                    var itemToRemove = cuponesL.SingleOrDefault(r => r.id == Convert.ToInt32(dgvCuponesImpagos.Rows[e.RowIndex].Cells["ID"].Value));
                    if (itemToRemove != null)
                        cuponesL.Remove(itemToRemove);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        #endregion

        #region Cupones Pagos

        private void limpiarCuponesPagos()
        {
            txtCuponPago.Text = string.Empty;
            txtCuponPago.Focus();
            try
            {
                double total = 0;

                foreach (DataGridViewRow fila in dgvCuponesPagos.Rows)
                {
                    if (!string.IsNullOrEmpty(fila.Cells["IMPORTE_PAGO"].Value.ToString()))
                    {
                        total += Convert.ToDouble(fila.Cells["IMPORTE_PAGO"].Value.ToString());
                    }
                    else
                    {
                        total += Convert.ToDouble(fila.Cells["TOTAL_PAGO"].Value.ToString());
                    }
                }

                lblTotal.Text = U.AgregarDecimales(total.ToString());
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void txtCuponesPagos_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarCupon(txtCuponPago, "ENTER");
            }
        }

        private void txtCuponPago_Leave(object sender, EventArgs e)
        {
            BuscarCupon(txtCuponPago, "LEAVE");
        }

        private void dgvCuponesPagos_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            try
            {
                if (e.ColumnIndex == 7)
                {
                    //lblTotal.Text = (Convert.ToDouble(lblTotal.Text) - Convert.ToDouble(U.AgregarDecimales(dgvCuponesPagos.Rows[e.RowIndex].Cells["IMPORTE"].Value.ToString()))).ToString();
                    dgvCuponesPagos.Rows.RemoveAt(e.RowIndex);
                    limpiarCuponesPagos();

                    var itemToRemove = cuponesL.SingleOrDefault(r => r.id == Convert.ToInt32(dgvCuponesPagos.Rows[e.RowIndex].Cells["ID_PAGO"].Value));
                    if (itemToRemove != null)
                        cuponesL.Remove(itemToRemove);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void dgvCuponesPagos_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            try
            {
                // -- HABILITAR CELDA IMPORTE DE CUPONES PAGOS --
                string headerText = dgvCuponesPagos.Columns[e.ColumnIndex].HeaderText;

                // Abort validation if cell is not in the CompanyName column.
                if (!headerText.Equals("Importe")) return;
                else
                {
                    if (e.RowIndex > -1)
                    {
                        dgvCuponesPagos.Rows[e.RowIndex].Cells["IMPORTE_PAGO"].ReadOnly = false;
                    }
                }
                // ----------------------------------------------
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void dgvCuponesPagos_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            try
            {

                string headerText = dgvCuponesPagos.Columns[e.ColumnIndex].HeaderText;

                // Abort validation if cell is not in the CompanyName column.
                if (!headerText.Equals("Importe")) return;

                Regex regex = new Regex(@"[\d]([.,][\d])?");
                string importe = string.Empty;
                importe = dgvCuponesPagos.Rows[e.RowIndex].Cells["IMPORTE_PAGO"].Value.ToString();

                error.Clear();
                if (!regex.IsMatch(importe))
                {
                    error.SetError(dgvCuponesPagos, "Debe ingresar un Importe numérico.");
                }
                else
                {
                    dgvCuponesPagos.Rows[e.RowIndex].Cells["IMPORTE_PAGO"].Value = U.AgregarDecimales(importe);
                    limpiarCuponesPagos();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void dgvCuponesPagos_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            //    string headerText = dgvCuponesPagos.Columns[e.ColumnIndex].HeaderText;

            //    // Abort validation if cell is not in the CompanyName column.
            //    if (!headerText.Equals("Importe")) return;

            //    Regex regex = new Regex(@"[\d]([.,][\d])?");
            //    string importe = string.Empty;
            //    importe = dgvCuponesPagos.Rows[e.RowIndex].Cells["IMPORTE"].Value.ToString();
            //    if (!regex.IsMatch(importe))
            //    {
            //        error.Clear();
            //        error.SetError(dgvCuponesPagos, "Debe ingresar un Importe numérico.");
            //        e.Cancel = true;
            //    }
        }

        private void dgvCuponesPagos_CellLeave(object sender, DataGridViewCellEventArgs e)
        {
            //    string headerText = dgvCuponesPagos.Columns[e.ColumnIndex].HeaderText;

            //    // Abort validation if cell is not in the CompanyName column.
            //    if (!headerText.Equals("Importe")) return;

            //    Regex regex = new Regex(@"[\d]([.,][\d])?");
            //    if (!regex.IsMatch(dgvCuponesPagos.Rows[e.RowIndex].Cells["IMPORTE"].Value.ToString()))
            //    {
            //        error.Clear();
            //        error.SetError(dgvCuponesPagos, "Debe ingresar un Importe numérico.");
            //        //e = true;
            //    }
        }

        #endregion

        private void cboCobrador_SelectedIndexChanged(object sender, EventArgs e)
        {
            cuponesAsignadosL = new List<CobradorCupon>();
            idCuponesAsignadosL = new List<int>();
            dgvCuponesAsignados.Rows.Clear();

            try
            {
                cuponesAsignadosL = Cobradores.FindCuponesByCobrador(Convert.ToInt32(cboCobrador.SelectedValue));
                idCuponesAsignadosL = cuponesAsignadosL.Select(a => a.cupon.id).ToList();

                foreach (var fila in cuponesAsignadosL)
                {
                    dgvCuponesAsignados.Rows.Add(fila.cupon.id, fila.cupon.numero, fila.cupon.socio.apellido + ", " + fila.cupon.socio.nombres, U.AgregarDecimales(fila.cupon.total.ToString()), fila.fecha.ToShortDateString());
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void BuscarCupon(TextBox txtCupon, string key)
        {
            bool error = false;
            bool existe = false;

            try
            {
                if (txtCupon.Text != string.Empty)
                {
                    txtCupon.Text = txtCupon.Text.Replace("'", "-");

                    _cupon = Cupones.FindByNumero(txtCupon.Text);

                    if (_cupon != null)
                    {
                        if (_cupon.estado == "P")
                        {
                            error = true;
                            MessageBox.Show("El cupón ya se encuentra pago, verifique el número de cupón e intente nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                        else if (_cupon.transito == "I") //INGRESO
                        {
                            error = true;
                            MessageBox.Show("El cupón ya ha sido ingresado, verifique el número de cupón e intente nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }

                        // EL CUPON NO PERTENECE AL COBRADOR
                        CobradorCupon _cobradorCupon = Cobradores.FindCuponesByCobrador(Convert.ToInt32(cboCobrador.SelectedValue)).Where(c => c.cupon.id == _cupon.id).SingleOrDefault();
                        if (_cobradorCupon == null)
                        {
                            error = true;
                            MessageBox.Show("El cupón no se encuentra asignado al cobrador seleccionado, verifique el número de cupón e intente nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }

                        if (error == true)
                        {
                            txtCupon.Text = string.Empty;
                            txtCupon.Focus();
                        }
                        else
                        {
                            if (key == "ENTER")
                            {
                                foreach (var item in cuponesL)
                                {
                                    if (txtCupon.Text == item.numero)
                                    {
                                        existe = true;
                                    }
                                }

                                if (!existe || cuponesL.Count > 0)
                                {
                                    cuponesL.Add(_cupon);

                                    if (txtCupon.Name == txtCuponImpago.Name)
                                    {
                                        dgvCuponesImpagos.Rows.Add(_cupon.id, _cupon.numero, _cupon.socio.apellido + ", " + _cupon.socio.nombres, U.AgregarDecimales(_cupon.total.ToString()), 0, dtpFecha.Value);
                                        limpiarCuponesImpagos();
                                    }
                                    else
                                    {
                                        dgvCuponesPagos.Rows.Add(_cupon.id, _cupon.numero, _cupon.socio.apellido + ", " + _cupon.socio.nombres, U.AgregarDecimales(_cupon.total.ToString()), 1, "", dtpFecha.Value);
                                        limpiarCuponesPagos();
                                    }
                                }
                                else
                                {
                                    MessageBox.Show("El cupón ya se encuentra en la grilla. Ingrese otro cupón.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                    if (txtCupon.Name == txtCuponImpago.Name)
                                    {
                                        limpiarCuponesImpagos();
                                    }
                                    else
                                    {
                                        limpiarCuponesPagos();
                                    }
                                }
                            }
                        }
                    }
                    else
                    {
                        MessageBox.Show("No se ha podido encontrar el número de cupón. Intente Nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        if (txtCupon.Name == txtCuponImpago.Name)
                        {
                            limpiarCuponesImpagos();
                        }
                        else
                        {
                            limpiarCuponesPagos();
                        }
                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void txtImporte_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {


        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            cuponesEntradaL = new List<CobradorCupon>();
            idCuponesEntradaL = new List<int>();
            cuponesPagosL = new List<Cobro>();

            try
            {
                foreach (DataGridViewRow fila in dgvCuponesImpagos.Rows)
                {
                    // -- ENTRADA DE CUPONES --
                    CobradorCupon _cobradorCupon = new CobradorCupon();

                    _cobradorCupon.cobrador_id = Convert.ToInt32(cboCobrador.SelectedValue);
                    _cobradorCupon.cupon_id = Convert.ToInt32(fila.Cells["ID"].Value);
                    _cobradorCupon.fecha = Convert.ToDateTime(dtpFecha.Value);
                    _cobradorCupon.tipo_movimiento = "I";

                    cuponesEntradaL.Add(_cobradorCupon);
                    // ------------------------

                    idCuponesEntradaL.Add(Convert.ToInt32(fila.Cells["ID"].Value));
                }

                foreach (DataGridViewRow fila in dgvCuponesPagos.Rows)
                {
                    // -- ENTRADA DE CUPONES --
                    CobradorCupon _cobradorCupon = new CobradorCupon();

                    _cobradorCupon.cobrador_id = Convert.ToInt32(cboCobrador.SelectedValue);
                    _cobradorCupon.cupon_id = Convert.ToInt32(fila.Cells["ID_PAGO"].Value);
                    _cobradorCupon.fecha = Convert.ToDateTime(dtpFecha.Value);
                    _cobradorCupon.tipo_movimiento = "I";

                    cuponesEntradaL.Add(_cobradorCupon);
                    // ------------------------

                    // -- CUPONES PAGOS --
                    bool pago = Convert.ToBoolean(fila.Cells["PAGO_PAGO"].Value);
                    if (pago == true)
                    {
                        // -- DATOS CUPON --
                        Cupon _cupon = new Cupon();
                        _cupon = Cobros.FindByCupon(fila.Cells["NUMERO_PAGO"].Value.ToString().Trim());
                        // -----------------

                        Cobro _cobro = new Cobro();

                        _cobro.cupon_id = _cobradorCupon.cupon_id;
                        _cobro.formapago_id = _cupon.socio.formapago_id;
                        _cobro.fecha = _cobradorCupon.fecha;
                        if (string.IsNullOrEmpty(fila.Cells["IMPORTE_PAGO"].Value.ToString()))
                        {
                            _cobro.total = Convert.ToDouble(U.AgregarDecimales(fila.Cells["TOTAL_PAGO"].Value.ToString()));
                        }
                        else
                        {
                            _cobro.total = Convert.ToDouble(U.AgregarDecimales(fila.Cells["IMPORTE_PAGO"].Value.ToString()));
                        }

                        cuponesPagosL.Add(_cobro);
                    }

                    // -------------------

                    idCuponesEntradaL.Add(Convert.ToInt32(fila.Cells["ID_PAGO"].Value));
                }

                bool iguales = idCuponesAsignadosL.OrderBy(a => a).SequenceEqual(idCuponesEntradaL.OrderBy(c => c));

                if (!iguales)
                {
                    DialogResult dr = new DialogResult();
                    dr = MessageBox.Show("El cobrador posee cupones pendientes, desea guardar los cambios?", "Advertencia", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation);
                    if (dr == System.Windows.Forms.DialogResult.Yes)
                    {
                        try
                        {
                            GuardarCupones();
                        }
                        catch (Exception ex)
                        {
                            throw ex;
                        }
                    }
                }
                else
                {
                    GuardarCupones();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void GuardarCupones()
        {
            int res = 0;
            try
            {
                res = Cobros.RegistrarCobroPorCobrador(cuponesEntradaL, cuponesPagosL);

                if (res > 0)
                {
                    MessageBox.Show("Los datos se registraron correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    inicializar();
                }
                else
                {
                    MessageBox.Show("No se ha podido registar el movimiento de los cupones. Intente Nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception e)
            {
                MessageBox.Show("Error : " + e.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
